package skyhyun;

public class J15_OOP1 {
	
	/** 객체지향 개발 기법(OOP : Object-Oriented Programming)
	 * 		OOP : 객체를 기반으로 프로그램을 작성하는 것
	 *  		OOP 언어로 응용 프로그램을 개발하는 경우, 문제 해결을 위해 실제 상황과 유사한 모델을 만들어야 함
	 *  		
	 *  
	 *  		예를 들어, 직원 세금을 계산하는 프로그램 작성
	 *  				프로그램에서 회사를 표현하는 회사 객체가 필요
	 *  				또한, 직원을 나타내는 직원객체, 세금을 나타내는 세금객체도 필요
	 *  		
	 *  		회사, 직원, 세금 객체를 자바 프로그램에서 코드로 나타내는 방법에 대해 알아봄
	 *  
	 *  		모든 객체에는 2가지 성질이 있음
	 *  				속성(property), 객체가 할 수 있는 행동(method)
	 *  				현실세계에 존재하는 객체를 자바언어로 가져오는 경우에도 속성과 행위는 있어야 함
	 *  				자바에서 속성은 field, 행위는 method 라고 부름
	 *  
	 *  		자바 객체를 만드는 방법은? - 설계도를 이용
	 *  				'차' 라는 객체를 잘 만들려면 좋은 차로 만들어 주는 [설계도]를 참고
	 *  				OOP 에서 객체를 만들어 주는 설계도를 [클래스]라 함
	 */
	
	/** 클래스(class)
	 * 		클래스는 동일한 유형의 객체를 만드는 청사진 / 설계도 또는 템플릿임(중요!)
	 * 		붕어빵 - 객체 / 붕어빵 틀 - 클래스 / 밀가루, 팥 - 속성
	 * 		클래스는 당신이 만들련는 객체의 종류를 결정함
	 * 
	 * 		요약하자면, 클래스는 프로그래머로 하여금 문제의 추상화를 만들 수 있게 해주는 OOP 도구임
	 * 		OOP에서 추상화(abstraction)는 실제 객체를 표현하기 위해 실제 객체에서 핵심적인 개념 또는 기능을 뽑아 프로그래밍 객체로 만드는 행위를 말함
	 * 		클래스는 자바 프로그램의 기본 뼈대
	 * 		자바 초보자는 클래스를 작성할 때 클래스이름, 필드, 메서드 등을 고려할 것
	 * 
	 * 		클래스 만들기
	 * 			class 클래스이름 {
	 * 					클래스 몸체 ( 필드, 메서드 )
	 * 			}		
	 * 
	 * 		클래스 이름은 반드시 대문자로 시작
	 * 		클래스 정의시 클래스 이름과 파일 이름은 동일해야 함
	 * 		클래스 내에 선언된 변수를 필드라 함
	 */ 
	
	// 생성자(constructor)
		// 생성자는 객체를 생성하는데 사용하는 특별한 메서드
		// 모든 클래스는 하나 이상의 생성자가 있어야 함
		// 설령, 메서드를 작성하지 않았더라도 컴파일러가 자동으로 만들어서 넣어줌
		// 생성자는 일반 메서드와는 달리 void 나 return 을 사용하지 않음
		// 생성자 이름은 클래스 이름과 동일해야 함
	
	public static void main(String[] args) {
		
		// 클래스를 사용하지 않고 학생 객체 생성
		String name1 = "김태희";
		int stdno1 = 123456789;
		String addr1 = "부산 남구 문현동";
		int mp1 = 1234567890;
		
		String name2 = "송혜교";
		int stdno2 = 234567890;
		String addr2 = "부산 진구 전포동";
		int mp2 = 345678901;

		// 클래스를 이용한 학생 객체 생성
//		Student taehee = new Student();
//		taehee.name = "태희";
//		taehee.stdno = 123456789;
//		taehee.addr = "부산 남구 문현동";
//		taehee.mp = 1234567890;
//		
//		Student suji = new Student();
//		suji.name = "수지";
//		suji.stdno = 123456789;
//		suji.addr = "서울 광진구 자양동";
//		suji.mp = 1234567890;
		
		Student one = new Student();
		System.out.println(one.name);
		Student two = new Student();
		System.out.println(two.name);
		
	}	// main

}	// class

// 학생 클래스 정의

class Student {
	String name = null;
	int stdno = 0;
	String addr = null;
	int mp = 0;
	

	// 생성자 추가 - 객체를 초기화하는데 사용
	public Student() {
		stdno = 12345;
		name = "아무개";
		addr = "서울";
		mp = 987654;
	}
}



// 고객(Customer) 클래스
// 아이디, 비밀번호, 이름, 주소, 전화번호, 이메일
class Customer {
	String name;
	
}

// 상품(Product) 클래스
// 상품번호, 상품명, 가격, 종류, 제조사
class Product {
	int pno;
	String pname;
	int price;
	String ptype;
	String maker;
}

// 스타크래프트 2의 테란 유닛(TerranUnit)을 클래스로 정의
// 생명력, 에너지, 방어력, 광물, 베스핀, 보급품, 생산시간

class TerranUnit {
	int life;
	int energy;
	int shield;
	int mineral;
	int gas;
	int supply;
	int time;
}
